package godzilla.ciudad.desastres;

import godzilla.ciudad.ListaDeEstrategias;
import godzilla.ciudad.Mapa;
import godzilla.ciudad.Punto;
import godzilla.ciudad.estructuras.Estructura;
import godzilla.ciudad.estructuras.Superficie;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Random;

public class Godzilla extends Desastre{

	private Mapa mapa;
	private Estrategia estrategia;
	private LinkedList<Superficie> camino;
	private Iterator<Superficie> iterador;
	private Superficie superficieQueEstaPisando;
	private boolean estaDespierto;
	private ListaDeEstrategias listaDeEstrategias;
	
	public Godzilla(){
		this.camino= new LinkedList<Superficie>();
		this.iterador = camino.iterator();
		estaDespierto = false;
		this.listaDeEstrategias = new ListaDeEstrategias();
		
	}

	public void daniar(Estructura estructuraADaniar) {
		
		estructuraADaniar.serDaniadoPorGodzilla();
		
	}

	public void aprenderMapa(Mapa mapa) {
		this.mapa = mapa;
		
	}

	public void definirEstrategia(Estrategia estrategia) {
		this.estrategia = estrategia;
		
	}

	public void atacarDesdePuntoPredefinido(Punto punto) {
		
		definirCaminoASeguirDesde(punto);
		seguirCaminoYDestruirCiudad();
		atacarCiudad();
		
	}

	private void seguirCaminoYDestruirCiudad() {
		

		this.iterador = camino.iterator();
		this.estaDespierto = true;
		
	}
	
	public boolean estaDespierto(){
		return (iterador.hasNext() && this.estaDespierto);
	}
	
	public void atacarCiudad(){
		
		if (iterador.hasNext()){
			superficieQueEstaPisando = iterador.next();
			daniar(superficieQueEstaPisando.estructuraContenida());

		} else {
			superficieQueEstaPisando = null;
			this.estaDespierto = false;
		}
		
	}

	private void definirCaminoASeguirDesde(Punto punto) {
				
		this.estrategia.definirMapa(mapa);		
		this.estrategia.comenzarEn(punto);
		this.estrategia.armarCamino(this.camino);
		
	}

	public void atacarMapa(Mapa mapa) {

		aprenderMapa(mapa);
		//definirEstrategia(new EstrategiaVerticalRecta());
		definirEstrategiaAleatoria();
		atacarDesdePuntoAleatorio();
		//atacarDesdePuntoPredefinido(new Punto(4,1));
		
	}
	
	private void definirEstrategiaAleatoria() {

		definirEstrategia(this.listaDeEstrategias.darEstrategiaAleatoria());
		
	}

	private void atacarDesdePuntoAleatorio() {

		int x= (new Random()).nextInt(this.mapa.dimensionX() - 3) + 2 ;
		int y= 1;
		atacarDesdePuntoPredefinido(new Punto(x,y));
		
		
	}

	public Superficie superficieQueEstaPisando(){
		return superficieQueEstaPisando;
	}


}
